﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Experiencia
    {
        public Experiencia()
        {
            this.Empresa = string.Empty;
        }

        private bool empregoAtual;
        private bool empregoAtualChanged;

        public long ExperienciaId { get; set; }

        public int CargoId { get; set; }

        public string Empresa { get; set; }

        public DateTime DataAdmissao { get; set; }

        public DateTime? DataDemissao { get; set; }

        public long CurriculoId { get; set; }

        public bool EmpregoAtual { get { return this.empregoAtual; } set { this.empregoAtual = value; this.empregoAtualChanged = true; } }

        public string Atividades { get; set; }

        public bool IsNew { get { return this.ExperienciaId == 0; } }

        public Cargo Cargo { get; set; }

        public bool Salvar()
        {
            var retorno = false;
            DataAccess.Experiencia model = null;
            Transaction.Begin(context =>
            {
                if (this.IsNew)
                    model = this.Insert(context);
                else
                    model = this.Update(context);
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {
                this.ExperienciaId = model.ExperienciaId;
            });
            return retorno;
        }

        private DataAccess.Experiencia Insert(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            context.AddToExperiencia(item);
            return item;
        }

        private DataAccess.Experiencia Update(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            return item;
        }

        private DataAccess.Experiencia CreateModel(DataAccess.SistemaCurricularEntities context)
        {
            DataAccess.Experiencia item = null;
            if (this.IsNew)
                item = new DataAccess.Experiencia();
            else
            {
                item = context.Experiencia.FirstOrDefault(f => f.ExperienciaId == this.ExperienciaId);
                if (item == null)
                    throw new Exception("Còdigo de experiencia inválido");
            }
            item.ExperienciaId = this.ExperienciaId;
            if(!this.EmpregoAtual)
                item.DataDemissao = this.DataDemissao;
            item.DataAdminissao = this.DataAdmissao;
            item.Empresa = this.Empresa;
            item.EmpregoAtual = this.EmpregoAtual;
            item.CargoId = this.CargoId;
            item.CurriculoId = this.CurriculoId;
            item.Atividades = this.Atividades;
            return item;
        }

        public static List<Lib.Experiencia> Listar(Experiencia item)
        {
            if (item == null)
                item = new Experiencia();
            var context = new DataAccess.SistemaCurricularEntities();
            var lista = context.Experiencia.Where(a => a.Empresa.StartsWith(item.Empresa) &&
                (item.CargoId == 0 || item.CargoId == a.CargoId) &&
                (item.CurriculoId == 0 || item.CurriculoId == a.CurriculoId) &&
                (!item.empregoAtualChanged || item.empregoAtual == a.EmpregoAtual)
                ).ToList().Select(s => item.Create(s)).ToList();
            return lista;
        }

        private Lib.Experiencia Create(DataAccess.Experiencia model)
        {
            if (model == null)
                return null;
            var item = new Experiencia();
            item.ExperienciaId = model.ExperienciaId;
            item.DataDemissao = model.DataDemissao; //?? DateTime.MinValue;
            item.DataAdmissao = model.DataAdminissao;
            item.Empresa = model.Empresa;
            item.EmpregoAtual = model.EmpregoAtual;
            item.CargoId = model.CargoId;
            item.CurriculoId = model.CurriculoId;
            item.Atividades = model.Atividades;
            item.Cargo = new Lib.Cargo().Create(model.Cargo);
            return item;
        }

        public bool Excluir()
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                context.Experiencia.DeleteObject(this.CreateModel(context));
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {

            });
            return retorno;
        }
    }
}
